package com.pronosticnews.client.admin.activity;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.web.bindery.event.shared.EventBus;
import com.pronosticnews.client.admin.ClientFactory;
import com.pronosticnews.client.admin.view.editJoueur.EditJoueurView;
import com.pronosticnews.client.admin.view.editJoueur.EditJoueurView.Presenter;
import com.pronosticnews.client.event.DeletedJoueurEvent;
import com.pronosticnews.client.event.DeletedJoueurEventHandler;
import com.pronosticnews.client.event.InformationMessageEvent;
import com.pronosticnews.client.event.NouveauJoueurEvent;
import com.pronosticnews.client.event.SelectedJoueurEvent;
import com.pronosticnews.client.event.SelectedJoueurEventHandler;
import com.pronosticnews.client.services.ClubService;
import com.pronosticnews.client.services.ClubServiceAsync;
import com.pronosticnews.client.services.JoueurService;
import com.pronosticnews.client.services.JoueurServiceAsync;
import com.pronosticnews.client.util.InformationMessage;
import com.pronosticnews.client.util.InformationMessage.TYPE_MESSAGE;
import com.pronosticnews.shared.model.ClubDto;
import com.pronosticnews.shared.model.JoueurDto;

import fr.ysa.services.config.ConfigRequetesDto;
import fr.ysa.services.config.TrieDto;
import fr.ysa.services.config.TrieDto.ORDRE;

public class EditJoueurActivity extends AbstractActivity implements Presenter {

	private EditJoueurView view;

	private PlaceController placeController;

	private JoueurServiceAsync joueurService;

	private AsyncCallback<JoueurDto> saveCallBack;

	private EventBus eventBus;

	private JoueurDto existingJoueur;

	private AsyncCallback<List<ClubDto>> getClubCallBack;

	private ConfigRequetesDto configGetClub;

	private ClubServiceAsync clubService;

	public EditJoueurActivity(ClientFactory clientFactory) {
		joueurService = GWT.create(JoueurService.class);
		clubService = GWT.create(ClubService.class);
		placeController = clientFactory.getPlaceController();
		view = clientFactory.getEditJoueurView();
		view.setPresenter(this);
		eventBus = clientFactory.getEventBus();

		saveCallBack = new AsyncCallback<JoueurDto>() {

			@Override
			public void onSuccess(JoueurDto result) {
				InformationMessage messageSuccess = new InformationMessage();
				messageSuccess.setType(TYPE_MESSAGE.SUCCESS);
				List<String> messages = new ArrayList<String>();
				messages.add("Le joueur a été créé/modifié avec succès !");
				messageSuccess.setText(messages);
				view.submitComplete();
				eventBus.fireEvent(new NouveauJoueurEvent());
				eventBus.fireEvent(new InformationMessageEvent(messageSuccess));
			}

			@Override
			public void onFailure(Throwable caught) {
				InformationMessage erreur = new InformationMessage();
				List<String> messages = new ArrayList<String>();
				messages.add(caught.getMessage());
				erreur.setText(messages);
				erreur.setType(TYPE_MESSAGE.ERROR);
				eventBus.fireEvent(new InformationMessageEvent(erreur));
			}
		};

		eventBus.addHandler(SelectedJoueurEvent.TYPE,
				new SelectedJoueurEventHandler() {

					@Override
					public void onSelect(SelectedJoueurEvent event) {
						existingJoueur = event.getJoueurSelected();
						view.setModeModification(true);
						view.setJoueur(existingJoueur);
					}
				});

		eventBus.addHandler(DeletedJoueurEvent.TYPE,
				new DeletedJoueurEventHandler() {

					@Override
					public void onDelete(DeletedJoueurEvent event) {
						existingJoueur = null;
						view.setModeModification(false);
					}
				});

		view.setModeModification(false);

	}

	@Override
	public void start(AcceptsOneWidget panel,
			com.google.gwt.event.shared.EventBus eventBus) {
		getClubs();
		panel.setWidget(view.asWidget());
	}

	@Override
	public void submit(JoueurDto editJoueur) {
		if (existingJoueur != null) {
			editJoueur.setId(existingJoueur.getId());
			joueurService.modifier(editJoueur, saveCallBack);
		} else {
			joueurService.sauvegarder(editJoueur, saveCallBack);
		}
	}

	@Override
	public void annuleModification() {
		existingJoueur = null;
	}

	@Override
	public void getClubs() {
		if (getClubCallBack == null) {
			getClubCallBack = new AsyncCallback<List<ClubDto>>() {

				@Override
				public void onSuccess(List<ClubDto> result) {
					view.setClubs(result);
				}

				@Override
				public void onFailure(Throwable caught) {
					InformationMessage erreur = new InformationMessage();
					erreur.setType(TYPE_MESSAGE.WARNING);
					List<String> messages = new ArrayList<String>();
					messages.add(caught.getMessage());
					erreur.setText(messages);
					eventBus.fireEvent(new InformationMessageEvent(erreur));
				}
			};
		}
		if (configGetClub == null) {
			configGetClub = new ConfigRequetesDto();
			TrieDto trieAsc = new TrieDto();
			trieAsc.setOrdre(ORDRE.ASC);
			trieAsc.setChamp(ClubDto.VALUE_NAME.nom.name());
			configGetClub.getTries().add(trieAsc);
		}
		clubService.trouver(configGetClub, getClubCallBack);
	}

}
